顧名思義,global區段就是讓你定義global變數用的。
語法很簡單:
(global $var_name|index (mut type)|type (initialize_expression))
實際上一個可變的global變數,可以這樣定義:
(global $var1 (mut i32) (i32.const 0))
這樣就定義了一個叫做$var1的global變數,他的型別是可變的32位元整數,初始值是0。
如果不加上mut,就等於是定義一個global常數,例如:
(global $var0 i32 (i32.const 1))
這個變數,就只能用get_global $var0
來取用,不能用set_global $var0
來賦值。
initialize_expression目前只能使用兩種指令:
例如:
(import "js" "limit" (global $limit i32))
(global $con i32 (get_global $limit))
可以利用start區段,指定在WebAssembly程式實例化時,要執行的函數。語法很簡單:
(start $func_name)
例如要在初始化時從記憶體讀取一個輸入的數值,然後存入global變數:
(memory (import "js" "buf") 1)
(global $n (mut i32) (i32.const 0))
(start $init)
(func $init
i32.load8_u
set_global $n
)
寫一個簡單的例子來測試一下這兩個區塊的使用:
test016.wat
(module
(memory (import "js" "buf") 1)
(global $n (mut i32) (i32.const 1))
(start $init)
(data 0 (i32.const 3))
(func (export "test") (result i32)
get_global $n
)
(func $init
i32.const 0
i32.load8_u
set_global $n
)
)
html端:
<html>
<body>
<div id="panel"></div>
<script src="../wasm_util.js"></script>
<script>
let buf = new WebAssembly.Memory({initial: 1});
let view = new Uint8Array(buf.buffer);
view[0] = 5;
let importObjects = {
js: {
buf: buf
}
};
new Wasm('test016.wasm').getInstance(importObjects)
.then(instance => {
document.getElementById('panel').innerHTML = 'Result: ' + instance.exports.test();
});
</script>
</body>
</html>
其實就是簡單地測試一下,會從$n這個global取出什麼數值。在WebAssembly程式中,會透過data區段把Memory的第一個byte設為3,global變數$n初始值是1,從Javascript環境中輸入到WebAssembly的Memory,則把第一個byte設為5。這樣在start區段執行$init函數,把global變數$n設為Memory的第一個byte。
測試結果:
結果是取到從Javascript輸入的Memory的第一個byte。
大致上簡單的WebAssembly程式大概就像這幾天介紹的這樣,明天來整理一下各種指令的列表。